#ifndef __SKIPTABLE_H__
#define __SKIPTABLE_H__

#include <stdio.h>
#include <pthread.h>  // 线程安全支持
#include <stdint.h>   // 持久化字节序转换
#include "public.h"

// 跳表最大层数
#define MAX_LEVEL 16
// 随机提升层数的概率（50%）
#define P 0.5

// 节点结构（键和值均为字符串）
typedef struct SNode {
    char *key;              // 字符串键
    char *value;            // 字符串值
    struct SNode *forward[]; // 柔性数组，存储各层后继指针
} SNode;

// 跳表结构（新增锁和持久化支持）
typedef struct SkipList {
    int level;              // 当前最大层数
    int size;               // 节点总数
    SNode *header;          // 表头节点（不存储实际数据）
#if SKIPLIST_MUTEX_LOCK
    pthread_mutex_t mutex_lock;  // 互斥锁（每个跳表独有）
#endif
#if SKIPLIST_RW_LOCK
    pthread_rwlock_t rw_lock;    // 读写锁（每个跳表独有）
#endif
} SkipList;

// 原有函数声明
SkipList *skiplist_init();
int skiplist_insert(SkipList *sl, const char *key, const char *value);
SNode *skiplist_search(SkipList *sl, const char *key);
int skiplist_update(SkipList *sl, const char *key, const char *new_value);
int skiplist_delete(SkipList *sl, const char *key);
int skiplist_get_size(SkipList *sl);
void skiplist_destroy(SkipList *sl);
void skiplist_print(SkipList *sl);  // 保留打印函数

// 新增函数声明
int skiplist_clear(SkipList *sl);  // 清空所有节点，保留跳表结构

// 全量持久化相关
int skiplist_full_store(SkipList *sl, const char *full_filename);
int skiplist_full_store_with_backup(SkipList *sl, const char *full_filename);
int skiplist_full_restore(const char *full_filename, SkipList *sl);

#endif